package com.cloud.utils;

import cn.hutool.core.convert.Convert;
import com.cloud.common.constants.GlobalConstants;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.util.Map;

/**
 * Jwt工具类
 *
 * @author yzj
 */
public class JWTUtils {

    // 令牌秘钥
    private static String keys = "yang@39b892aa8c167a82b4b329abe0ba24d8";
    private static SecretKey secret = Keys.hmacShaKeyFor(keys.getBytes());

    /**
     * 从数据声明生成令牌
     *
     * @param claims 数据声明
     * @return 令牌
     */
    public static String createToken(Map<String, Object> claims) {
        return Jwts.builder().setClaims(claims).signWith(secret, Jwts.SIG.HS256).compact();
    }

    /**
     * 从令牌中获取数据声明
     *
     * @param token 令牌
     * @return 数据声明
     */
    public static Claims parseToken(String token) {
        try {
            return Jwts.parser().verifyWith(secret).build().parseSignedClaims(token).getPayload();
        } catch (Exception e) {
            throw new RuntimeException("解析token信息异常:" + e);
        }
    }

    /**
     * 根据令牌获取用户标识
     *
     * @param claims 身份信息
     * @return 用户信息
     */
    public static String getClaimsKey(Claims claims, String key) {
        return Convert.toStr(claims.get(key), null);
    }

    /**
     * 根据令牌获取用户Token标识
     *
     * @param token 令牌
     * @return 用户ID
     */
    public static String getUserToken(String token) {
        return getClaimsKey(parseToken(token), GlobalConstants.tokenKey);
    }

}
